home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Magazin/MacEasy 52
/
Mac Magazin and MacEasy Magazine CD - Issue 52.iso
/
Updates
/
Stata 5.0 Ado-files
/
ado.sea
/
newado
/
stack.ado
< prev
next >
Wrap
Text File
|
1998-11-22
|
5KB
|
228 lines
*! version 3.1.6 09apr1998
program define stack
version 5.0
local varlist "req ex min(2)"
local if "opt"
local in "opt"
local options "Into(str) Group(integer 0) CLEAR WIde"
parse "`*'"
if ("`into'"=="") {
if `group'==0 {
error 198
}
Makeinto `group' `varlist'
}
else {
if `group'!=0 {
di in red "may not specify both group() and into()"
exit 198
}
Fixinto `into'
}
local into $S_1
global S_1
/* # of args in varlist */
local vcnt : word count `varlist'
/* # of args in into() */
local icnt : word count `into'
local grps `vcnt'/`icnt' /* # of groups */
if (`grps' != int(`grps') | `grps'<=1) {
di in red "incorrect number of variables specified"
exit 198
}
/*
Removed by wwg 19sep1997-- Stata 5 automatically repartitions memory
/* verify whether the result will fit */
quietly describe, short
local maxobs = _result(4) /* size of partition */
capture count `if' `in'
local newobs = _result(1)*`grps' /* # of new obs */
if (`newobs' > `maxobs'-20) {
di in red "insufficient memory (observations)"
di in red "`newobs' required and " `maxobs'-20 " available."
exit 901
}
*/
/* present warning */
if "`clear'"=="" {
di in blu "Warning: data in memory will be lost." /*
*/ _n _col(10) /*
*/ "Press any key to continue, Ctrl-Break to abort."
set more 0
more
}
tempfile stacktp
/* save data needed to stack */
if ("`if'"!="" | "`in'"!="") {
quietly keep `if' `in'
}
keep `varlist'
quietly save "`stacktp'", replace
/* preserve varlist for wide option */
local vlist "`varlist'"
/* stack the data */
local grp "1"
capture {
while (`grp' <= `grps') {
parse "`varlist'", parse(" ")
local i "1"
local touse
while (`i' <= `icnt') {
local touse "`touse' `1'"
mac shift
local i = `i' + 1
}
local varlist "`*'" /* reset varlist */
quietly use "`stacktp'", clear
keep `touse'
gen int _stack = `grp'
local i "1"
while (`i' <= `icnt') {
local name1 : word `i' of `touse'
local new1 : word `i' of `into'
if ("`name1'" != "`new1'") {
rename `name1' `new1'
}
local i = `i' + 1
}
tempfile tempfi
local tf`grp' "`tempfi'"
quietly save "`tempfi'"
local grp = `grp' + 1
}
quietly use "`tf1'", clear
local grp 2
while (`grp' <= `grps') {
quietly append using "`tf`grp''"
local grp = `grp' + 1
} /* done */
if ("`wide'"!="") { /* wide option */
local grp 1
while (`grp' <= `grps') {
parse "`vlist'", parse(" ")
local i "1"
local touse
while (`i' <= `icnt') {
local touse "`touse' `1'"
mac shift
local i = `i' + 1
}
local vlist "`*'"
local i "1"
while (`i' <= `icnt') {
local name1 : word `i' of `touse'
capture confirm new variable `name1'
if (_rc==0) {
local name2 : word `i' of `into'
local type : type `name2'
quietly gen `type' `name1' = /*
*/ `name2' /*
*/ if _stack==`grp'
}
local i = `i' + 1
}
local grp = `grp' + 1
}
}
global S_FN
global S_FNDATE
exit
}
/* error-abort code */
if (_rc) {
local rc = _rc
drop _all
di in red "(memory cleared)"
error `rc'
}
global S_FN
global S_FNDATE
end
program define Fixinto /* newvarlist */
parse "`*'", parse("- ")
while "`1'" != "" {
if "`2'"=="-" {
Split "`1'" "`1' `2' `3'"
local stub "$S_1"
local n1 $S_2
Split "`3'" "`1' `2' `3'"
local n2 "$S_2"
if "`stub'" != "$S_1" | `n1'>`n2' {
Fixerr "`1' `2' `3'"
/*NOTREACHED*/
}
local i `n1'
while `i' <= `n2' {
local res "`res' `stub'`i'"
local i = `i' + 1
}
mac shift 3
}
else {
local res "`res' `1'"
mac shift
}
}
global S_2
global S_1 "`res'"
end
program define Split /* "varname#" "string for error message" */
if "`1'"=="" {
Fixerr "`2'"
/*NOTREACHED*/
}
local l = length("`1'")
while index("0123456789",substr("`1'",`l',1)) {
local l = `l' - 1
if `l' == 0 {
Fixerr "`2'"
/*NOTREACHED*/
}
}
global S_1 = substr("`1'",1,`l')
global S_2 = substr("`1'",`l'+1,.)
if "$S_1"=="" | "$S_2"=="" {
Fixerr "`2'"
/*NOTREACHED*/
}
end
program define Fixerr
di in red _quote "`1'" _quote " invalid"
exit 198
end
program define Makeinto /* # varnames */
local g "`1'"
if `g' <= 0 {
di in red "group(`g') invalid"
exit 198
}
mac shift
local n : word count `*'
local v = `n' / `g'
if `v' != int(`v') | `v'==0 {
di in red "`n' variables cannot be stacked into `g' groups;"
di in red "there would be " `v' " variables/group."
exit 198
}
local i 1
global S_1
while `i' <= `v' {
global S_1 $S_1 ``i''
local i = `i' + 1
}
end
exit